#ifndef AST_CALL
#define AST_CALL
#include <string>
#include <list>
#include "node.h"

namespace AST {

    /**
     * Chamada de Função
     *
     * Expressão utilizada para criar chamadas de funções na linguagem,
     * possuindo um identificador e parâmetros para execução do subprograma.
     * Estes parâmetros são armazenados como nós de árvore abstrata de sintaxe e
     * podem ser outras expressões.
     *
     * @category AST
     * @package  AST
     */
    class Call : public Node {

    private:

        /**
         * Conteúdo Capturado pelo Token
         */
        std::string* _content;

        /**
         * Parâmetros de Execução
         */
        std::list<Node*> _parameters;

        /**
         * Configuração de Conteúdo do Token
         *
         * Durante o processamento de entrada para o compilador da linguagem,
         * uma chamada de função é identificada utilizando o conteúdo
         * representante que foi capturado pelo Token.
         *
         * @param  std::string* Conteúdo para Configuração
         * @return Call*        Próprio Objeto para Encadeamento
         */
        Call* _setContent(std::string*);

    public:

        /**
         * Construtor Padrão
         *
         * Método responsável pela inicialização de instâncias para nós de
         * árvore abstrata de sintaxe que representa uma chamada de função da
         * linguagem. Como parâmetro, recebe o conteúdo capturado pelo Token que
         * representa sua identificação.
         *
         * @param std::string* Conteúdo para Configuração
         */
        Call(std::string*);

        Call(std::string*, std::list<Node*>*);

        /**
         * Apresenta o Conteúdo Capturado pelo Token
         *
         * Durante a leitura da entrada pelo compilador e na criação do objeto
         * representante de chamada de função, apresenta-se o conteúdo capturado
         * pelo Token. Este conteúdo pode ser apresentado utilizando este
         * método.
         *
         * @return std::string* Conteúdo Solicitado
         */
        std::string* getContent();

        /**
         * Adicionar Parâmetro
         *
         * Os parâmetros são expressões que podem ser passadas durante a chamada
         * de função na linguagem, fornecendo assim entradas para o subprograma
         * que será carregado. Esta expressão será adicionada a uma lista
         * interna da chamada.
         *
         * @param  Node* Expressão para Inclusão
         * @return Call* Próprio Objeto para Encadeamento
         */
        Call* addParameter(Node*);

        /**
         * Captura de Parâmetros
         *
         * Todos os parâmetros de chamada de função da linguagem podem ser
         * capturados quando necessário utilizando este método. Será apresentado
         * o conjunto completo construído.
         *
         * @return std::list<Node*> Elemento Solicitado
         */
        std::list<Node*> getParameters();

        // Sobrescrita
        std::string toString(int);

    };

};

#endif

